﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI.WebControls;
using EBAYVN.Dao;
using ETRANPORT.Domain;
using EBAYVN.Util;
using ETRANPORT.Web.Common;
using ETRANPORT.Web.Shared;
using ETRANPORT.Web.UserControls;
using System.Xml;


namespace ETRANPORT.Web.Forms.NhanVien
{
    public partial class DangKiLichTrinh : Authentication
    {

        private LichTrinhDao ltrDao = new LichTrinhDao();
        
        #region Properties

        protected LICHTRINH Obj
        {
            get
            {

                if (!IsValid())
                    return null;
                var lt = new LICHTRINH
                {
                    
                    ID=txtMaLichTrinh.Text.Trim(),
                    TENLICHVC=txtTenLichTrinh.Text.Trim(),
                    
                    NGAYBD=DateTimeUtil.GetVietNamDate(txtNgayBatDau.Text.Trim()),
                    NGAYKT=DateTimeUtil.GetVietNamDate(txtNgayKetThuc.Text.Trim()),
                    NGAYNHAP=DateTime.Now,
                    MANVNHAP=LoginInfo.MANV,
                    ISEMPTY=true,
                    MAPHUONGTIEN=txtMaPT.Text.Trim(),
                    SOTOA=int.Parse(txtSoToa.Text.Trim()),
                    SONVDANGKY=int.Parse(txtSoNhanVienPhu.Text.Trim()),
                };
                if(ddlDiemBD.SelectedValue.Equals("%")){
                    lt.IDDIEMBD=int.Parse(ddlDiemBD.SelectedValue);
                }
                if (!ddlDiemKT.SelectedValue.Equals("%"))
                {
                    lt.IDDIEMKT = int.Parse(ddlDiemKT.SelectedValue);
                }
                
                return lt;
            }
        }

        private Mode UpdateMode
        {
            get
            {
                try
                {
                    if (Session[SessionKey.MODE] != null)
                    {
                        var mode = Convert.ToInt32(Session[SessionKey.MODE]);
                        return (mode == Mode.Update.GetHashCode()) ? Mode.Update : Mode.Create;
                    }

                    return Mode.Create;
                }
                catch (Exception)
                {
                    return Mode.Create;
                }
            }

            set
            {
                Session[SessionKey.MODE] = value.GetHashCode();
            }
        }

        private FilteredMode Filtered
        {
            get
            {
                try
                {
                    if (Session[SessionKey.FILTEREDMODE] != null)
                    {
                        var mode = Convert.ToInt32(Session[SessionKey.FILTEREDMODE]);
                        return (mode == FilteredMode.Filtered.GetHashCode()) ? FilteredMode.Filtered : FilteredMode.None;
                    }

                    return FilteredMode.None;
                }
                catch (Exception)
                {
                    return FilteredMode.None;
                }
            }

            set
            {
                Session[SessionKey.FILTEREDMODE] = value.GetHashCode();
            }
        }

        #endregion



        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {

                if (!Page.IsPostBack)
                {
                    LoadStaticReferences();
                    BindDataForGrid();
                    BindDanhSachDaDangKi();
                }
            }
            catch (Exception ex)
            {
                DoError(new Message(MessageConstants.E_EXCEPTION, MessageType.Error, ex.Message, ex.StackTrace));
            }
        }

        
        
       

        #region Startup script registeration
        private void ShowError(string message, string controlId)
        {
            ((EOS)Page.Master).ShowError(message, controlId);
        }

        private void ShowError(string message)
        {
            ((EOS)Page.Master).ShowError(message);
        }

        private void ShowInfor(string message)
        {
            ((EOS)Page.Master).ShowInfor(message);
        }

        private void CloseWaitingDialog()
        {
            ((EOS)Page.Master).CloseWaitingDialog();
        }

        private void SetReadonly(string id, bool isReadonly)
        {
            ((EOS)Page.Master).SetReadonly(id, isReadonly);
        }

        private void SetControlValue(string id, string value)
        {
            ((EOS)Page.Master).SetControlValue(id, value);
        }

        private void HideDialog(string divId)
        {
            ((EOS)Page.Master).HideDialog(divId);
        }

        private void UnblockDialog(string divId)
        {
            ((EOS)Page.Master).UnblockDialog(divId);
        }

        #endregion

        private void LoadStaticReferences()
        {
            try
            {
                ClearForm();
                txtNgayBatDau.Text = DateTime.Now.ToString("dd/MM/yyyy");
                txtNgayKetThuc.Text = DateTime.Now.AddDays(10).ToString("dd/MM/yyyy");
            }
            catch (Exception ex)
            {
                DoError(new Message(MessageConstants.E_EXCEPTION, MessageType.Error, ex.Message, ex.StackTrace));
            }
        }
        private bool IsValid()
        {
            if (String.IsNullOrEmpty(txtMaLichTrinh.Text.Trim()))
            {
                ShowError(String.Format(Resources.Message.E_INVALID_DATA, "Mã lịch trình"), txtMaLichTrinh.ClientID);
                return false;
            }
            if (String.IsNullOrEmpty(txtTenLichTrinh.Text.Trim()))
            {
                ShowError(String.Format(Resources.Message.E_INVALID_DATA, "Tên lịch trình"), txtTenLichTrinh.ClientID);
                return false;
            }
            if (!String.IsNullOrEmpty(txtNgayBatDau.Text.Trim()))
            {
                try
                {
                    DateTime ngay = DateTimeUtil.GetVietNamDate(txtNgayBatDau.Text.Trim());
                }
                catch
                {
                    ShowError(String.Format(Resources.Message.E_INVALID_DATA, "Ngày bắt đầu"), txtNgayBatDau.ClientID);
                }
            }
            if (!String.IsNullOrEmpty(txtNgayKetThuc.Text.Trim()))
            {
                try
                {
                    DateTime ngay = DateTimeUtil.GetVietNamDate(txtNgayKetThuc.Text.Trim());
                }
                catch
                {
                    ShowError(String.Format(Resources.Message.E_INVALID_DATA, "Ngày kết thúc"), txtNgayKetThuc.ClientID);
                }
            }
            var sotoa = ConvertUtil.ToInteger(txtSoToa.Text.Trim());
            if (!sotoa.HasValue) { ShowError("Số toa xe không hợp lệ", txtSoToa.ClientID); }
            var sonv = ConvertUtil.ToInteger(txtSoNhanVienPhu.Text.Trim());
            if (!sotoa.HasValue) { ShowError("Số nhân viên phụ xe không hợp lệ", txtSoNhanVienPhu.ClientID); }
            return true;
        }
        private void ClearForm()
        {
            txtMaLichTrinh.Text=ltrDao.NewId();
            txtTenLichTrinh.Text="";
            txtMaPT.Text="";
            lbTenPhuongTien.Text="";
            CommonFunc.BindDropDownList(ddlDiemBD, new DiaDiemDao().GetList(), "TENDIADIEM", "ID",true);
            CommonFunc.BindDropDownList(ddlDiemKT, new DiaDiemDao().GetList(), "TENDIADIEM", "ID", true);
            Filtered = FilteredMode.None;
            upnlInfor.Update();
        }
        private void BindPhuongTien()
        {
            var listpt = new PhuongTienDao().GetList(txtKeywordPT.Text.Trim());
            gvPhuongTien.DataSource = listpt;
            gvPhuongTien.PagerInforText = listpt.Count.ToString();
            gvPhuongTien.DataBind();
        }
        private void BindDataForGrid()
        {
            try
            {
                if (Filtered == FilteredMode.None)
                {
                    var objList = ltrDao.GetListForDangKi(LoginInfo.MANV);
                    gvList.DataSource = objList;
                    gvList.PagerInforText = objList.Count.ToString();
                    gvList.DataBind();
                }
                else
                {
                    String TenLichTrinh = txtTenLichTrinh.Text.Trim();
                    DateTime NgayBatDau = DateTimeUtil.GetVietNamDate(txtNgayBatDau.Text.Trim());
                    DateTime NgayKetThuc = DateTimeUtil.GetVietNamDate(txtNgayKetThuc.Text.Trim());
                    String MaPT = txtMaPT.Text.Trim();
                    var bd = ConvertUtil.ToInteger(ddlDiemBD.SelectedValue);
                    var kt = ConvertUtil.ToInteger(ddlDiemKT.SelectedValue);
                    var objList = ltrDao.SearchForDangKi(LoginInfo.MANV, txtTenLichTrinh.Text.Trim(), bd, kt, NgayBatDau, NgayKetThuc, txtMaPT.Text.Trim());
                    gvList.DataSource = objList;
                    gvList.PagerInforText = objList.Count.ToString();
                    gvList.DataBind();
                }
            }
            catch (Exception ex)
            {
                DoError(new Message(MessageConstants.E_EXCEPTION, MessageType.Error, ex.Message, ex.StackTrace));
            }
        }

        private void BindDanhSachDaDangKi()
        {
            var listDaDK = ltrDao.GetListDaDangKi(LoginInfo.MANV);
            gvDaDanKi.DataSource = listDaDK;
            gvDaDanKi.PagerInforText = listDaDK.Count.ToString();
            gvDaDanKi.DataBind();
            upDaDangKi.Update();
        }
        protected void btnBrowPhuongTien_Click(object sender, EventArgs e)
        {
            BindPhuongTien();
            upnlPhuongTien.Update();
            UnblockDialog("divPhuongTien");
        }
        protected void btnFiterPT_Click(object sender, EventArgs e)
        {
            BindDataForGrid();
            upnlGrid.Update();
            CloseWaitingDialog();
        }
        protected void gvPhuongTien_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                var id = e.CommandArgument.ToString();
                switch (e.CommandName)
                {
                    case "SelectedPT":
                        var pt = new PhuongTienDao().Get(id);
                        if (pt != null)
                        {
                            SetControlValue(txtMaPT.ClientID, pt.MAPT);
                            lbTenPhuongTien.Text = pt.TENPT;
                            upnlInfor.Update();
                            HideDialog("divPhuongTien");
                            CloseWaitingDialog();

                        }
                        break;
                }
            }
            catch (Exception ex)
            {
                DoError(new Message(MessageConstants.E_EXCEPTION, MessageType.Error, ex.Message, ex.StackTrace));
            }
        }
        protected void btnFilter_Click(object sender, EventArgs e)
        {
            Filtered = FilteredMode.Filtered;
            CloseWaitingDialog();
            BindDataForGrid();
            upnlGrid.Update();
        }

        protected void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                if (!HasInsertPermission)
                {
                    CloseWaitingDialog();
                    ShowError(Resources.Message.WARN_PERMISSION_DENIED);
                    return;
                }
                var strIds = Request["listIds"];
                if ((strIds != null) && (!string.Empty.Equals(strIds)))
                {
                    var listIds = strIds.Split(',');
                    if (listIds.Count() > 1)
                    {
                        CloseWaitingDialog();
                        ShowError("Bạn chỉ được đăng kí 1 lịch trình trên một lần");
                        return;
                    }
                    if (listIds.Count() == 0) { CloseWaitingDialog(); ShowError("Bạn phải chọn lịch trình đăng kí"); return; }
                    var id = listIds[0];
                    var ltr = ltrDao.Get(id);
                    if (ltr == null)
                    {
                        CloseWaitingDialog();
                        ShowError("Lịch trình không tồn tại");
                        return;
                    }
                    // một nhân viên chỉ được phép dăng kí 1 lịch trình.
                    var checkone = ltrDao.CheckIsExistDK(LoginInfo.MANV, id);
                    if (!checkone)
                    {
                        CloseWaitingDialog();
                        ShowError("Bạn đã đăng kí lịch trình này rồi");
                        return;
                    }
                    // một nhân viên chỉ được đăng kí lịch trình khách khi nhân viên đó không tồn tại trong danh sách lịch trình chưa hoàn thành
                    var nv = new NhanVienDao().Get(LoginInfo.MANV);
                    if (nv.MACV==null ||(!nv.MACV.Equals("LX") && !nv.MACV.Equals("PX")))
                    {
                        CloseWaitingDialog();
                        ShowError("Công việc của bạn không phù hợp để đăng kí lịch trình");
                        return;
                    }
                    if (nv.ISPHANCONG.HasValue && nv.ISPHANCONG.Value.Equals(true))
                    {
                        CloseWaitingDialog();
                        ShowError("Bạn không được phép đăng kí lịch trình mới trong khi lịch trình bạn đăng kí trước đó chưa hoàn thành");
                        return;
                    }
                    if (checkone)
                    {
                        var msg = ltrDao.DangKiLichTrinh(ltr, nv);
                        if (msg.MsgType != MessageType.Error)
                        {
                            CloseWaitingDialog();
                            ShowInfor("Đăng kí thành công");
                        }
                        else
                        {
                            CloseWaitingDialog();
                            ShowError(msg.MsgCode);
                        }
                    }
                }
                BindDataForGrid();
                BindDanhSachDaDangKi();
                upnlGrid.Update();
                CloseWaitingDialog();

            }
            catch (Exception ex)
            {
                DoError(new Message(MessageConstants.E_EXCEPTION, MessageType.Error, ex.Message, ex.StackTrace));
            }

        }

        protected void btnCancel_Click(object sender, EventArgs e)
        {
            ClearForm();
            CloseWaitingDialog();
        }

        protected void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                if (!HasInsertPermission)
                {
                    CloseWaitingDialog();
                    ShowError(Resources.Message.WARN_PERMISSION_DENIED);
                    return;
                }
                var strIds = Request["listIdsddk"];
                if ((strIds != null) && (!string.Empty.Equals(strIds)))
                {
                    var listIds = strIds.Split(',');
                    if (listIds.Count() > 1)
                    {
                        CloseWaitingDialog();
                        ShowError("Bạn chỉ được xóa 1 lịch trình trên một lần");
                        return;
                    }
                    if (listIds.Count() == 0) { CloseWaitingDialog(); ShowError("Bạn phải chọn lịch trình đăng kí"); return; }
                    var id = listIds[0];
                    var ltr = ltrDao.Get(id);
                    if (ltr == null)
                    {
                        CloseWaitingDialog();
                        ShowError("Lịch trình không tồn tại");
                        return;
                    }
                    var msg = ltrDao.HuyDangKy(ltr, LoginInfo.NHANVIEN);
                    if (msg.MsgType != MessageType.Error)
                    {
                        
                        CloseWaitingDialog();
                        ShowInfor("Hủy đăng kí thành công");
                    }
                    else
                    {
                        CloseWaitingDialog();
                        ShowError(ResourceLabel.Get(msg));
                    }
                    
                }
                BindDataForGrid();
                BindDanhSachDaDangKi();
                upnlGrid.Update();
                CloseWaitingDialog();

            }
            catch (Exception ex)
            {
                DoError(new Message(MessageConstants.E_EXCEPTION, MessageType.Error, ex.Message, ex.StackTrace));
            }
        }
        protected void BindItem(LICHTRINH obj)
        {
            SetControlValue(txtMaLichTrinh.ClientID, obj.ID);
            SetControlValue(txtTenLichTrinh.ClientID, obj.TENLICHVC);
            SetControlValue(txtNgayBatDau.ClientID,obj.NGAYBD!=null?obj.NGAYBD.Value.ToString("dd/MM/yyyy"):"");
            SetControlValue(txtNgayKetThuc.ClientID,obj.NGAYKT!=null?obj.NGAYKT.Value.ToString("dd/MM/yyyy"):"");
            SetControlValue(txtSoToa.ClientID, obj.SOTOA.HasValue ? obj.SOTOA.Value.ToString() : "");
            SetControlValue(txtSoNhanVienPhu.ClientID, obj.SONVDANGKY.HasValue ? obj.SONVDANGKY.Value.ToString() : "");
            var diembd = ddlDiemBD.Items.FindByValue(obj.IDDIEMBD.Value.ToString());
            if (diembd != null)
                ddlDiemBD.SelectedIndex = ddlDiemBD.Items.IndexOf(diembd);
            var diemkt = ddlDiemBD.Items.FindByValue(obj.IDDIEMKT.Value.ToString());
            if (diemkt != null)
                ddlDiemKT.SelectedIndex = ddlDiemKT.Items.IndexOf(diemkt);
            SetControlValue(txtMaPT.ClientID, obj.MAPHUONGTIEN);
            var lichlamviec = ltrDao.GetListLichLamViec(obj.ID);
            string tx=lichlamviec.Where(p=>p.MALICHTRINH.Equals(obj.ID) && p.MACV.Equals("LX")).Count().ToString();
            string px=lichlamviec.Where(p=>p.MALICHTRINH.Equals(obj.ID) && p.MACV.Equals("PX")).Count().ToString();
            lbHienTrang.Text = string.Format("Lịch trình này hiện có {0} tài xế và {1} phụ xe", tx, px).ToUpper();
            int i=1;
            foreach (var ct in lichlamviec)
            {
                if (ct.MACV.Equals("LX"))
                {
                    lbTaiXe.Text = ct.NHANVIEN.HOTEN;
                }
                if (ct.MACV.Equals("PX"))
                {
                    switch (i)
                    {
                        case 1:
                            lbPX1.Text = ct.NHANVIEN.HOTEN;
                            break;
                        case 2:
                            lbPX2.Text = ct.NHANVIEN.HOTEN;
                            break;
                        case 3:
                            lbPX3.Text = ct.NHANVIEN.HOTEN;
                            break;
                        case 4:
                            lbPX4.Text = ct.NHANVIEN.HOTEN;
                            break;
                        case 5:
                            lbPX5.Text = ct.NHANVIEN.HOTEN;
                            break;
                    }
                }
                i++;
            }
            upnlInfor.Update();
            CloseWaitingDialog();
        }
        protected void gvList_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                var id = e.CommandArgument.ToString();

                switch (e.CommandName)
                {
                    case "EditItem":
                        var objDb = ltrDao.Get(id);

                        if(objDb != null)
                        {
                            BindItem(objDb);
                            UpdateMode = Mode.Update;
                        }

                        CloseWaitingDialog();

                        break;
                }
            }
            catch (Exception ex)
            {
                DoError(new Message(MessageConstants.E_EXCEPTION, MessageType.Error, ex.Message, ex.StackTrace));
            }
        }

        private void HuyDangKi(LICHTRINH objLtr)
        {
            
        }
        protected void gvDaDanKi_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                var id = e.CommandArgument.ToString();

                switch (e.CommandName)
                {
                    case "EditItem":
                        var objDb = ltrDao.Get(id);

                        if (objDb != null)
                        {
                            BindItem(objDb);
                            UpdateMode = Mode.Update;
                        }

                        CloseWaitingDialog();

                        break;
                    case "Delete":
                        var ltr = ltrDao.Get(id);
                        if (ltr == null)
                        {
                            CloseWaitingDialog();
                            ShowError("Lịch trình không tồn tại");
                            return;
                        }
                        HuyDangKi(ltr);
                        break;
                }
            }
            catch (Exception ex)
            {
                DoError(new Message(MessageConstants.E_EXCEPTION, MessageType.Error, ex.Message, ex.StackTrace));
            }
        }
    }
}